/**
 * @file sys_manager.c
 * @brief 系统状态管理器实现
 */

#include "sys_manager.h"
#include "user_config.h"
#include "drv_can.h"

#if (FEATURE_DEBUG_BYPASS_BOARD_MANAGER == 0)
#include "drv_ad_det.h"
#endif

/* 私有全局变量 */
static T_SYSTEM_STATE s_system_state = SYS_STATE_BOOT;  /* 系统当前状态 */
static uint8_t s_board_id = 0;                          /* 当前板号(1-11), 0=未分配 */

/* 常量 */
#define CAN_ID_BOARD 0x100

/**
 * @brief 初始化系统管理器
 */
int sys_manager_init(void)
{
#if (FEATURE_DEBUG_BYPASS_BOARD_MANAGER == 1)
    /* 调试模式: 使用默认板号,直接进入播放模式 */
    s_system_state = SYS_STATE_PLAYING;
    s_board_id = FEATURE_DEBUG_DEFAULT_BOARD_ID;
#else
    /* 正常模式: 从BOOT状态开始 */
    s_system_state = SYS_STATE_BOOT;
    s_board_id = 0;
#endif
    return 0;
}

/**
 * @brief 获取当前系统状态
 */
T_SYSTEM_STATE sys_manager_get_state(void)
{
    return s_system_state;
}

/**
 * @brief 设置系统状态
 */
void sys_manager_set_state(T_SYSTEM_STATE state)
{
    s_system_state = state;
}

/**
 * @brief 获取当前板号
 */
uint8_t sys_manager_get_board_id(void)
{
    return s_board_id;
}

/**
 * @brief 检查板号是否已分配
 */
bool sys_manager_is_board_assigned(void)
{
    return (s_board_id != 0);
}

#if (FEATURE_DEBUG_BYPASS_BOARD_MANAGER == 0)
/**
 * @brief GPIO中断回调（接收板号并处理）
 * @param board_char 接收到的板号字符(0xB1-0xBB)
 * @note 正常模式下处理板号分配
 */
void sys_manager_gpio_isr_callback(uint8_t board_char)
{
    /* 仅在BOOT模式下处理 */
    if (s_system_state != SYS_STATE_BOOT)
    {
        return;
    }

    /* 检查是否是有效的板号字符 */
    if (board_char < BOARD_CHAR_MIN || board_char > BOARD_CHAR_MAX)
    {
        return;
    }

    /* 计算板号 (0xB1->1, 0xBB->11) */
    s_board_id = board_char - BOARD_CHAR_MIN + 1;

    /* 通过CAN回传当前板号字符（例如收到B1回传B1，收到B2回传B2） */
    drv_can_send(CAN_ID_BOARD, &board_char, 1);

    /* 如果不是最后一块板，向下一块板发送下一个板号 */
    if (board_char < BOARD_CHAR_MAX)
    {
        drv_ad_det_send_char(board_char + 1);
    }

    /* 板号分配完成，切换到播放模式 */
    s_system_state = SYS_STATE_PLAYING;
}
#endif /* FEATURE_DEBUG_BYPASS_BOARD_MANAGER */

/******************************** 文件结束 *********************************/
